package top.xia17.plugins.fast.common.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import top.xia17.plugins.fast.common.exceptions.BadRequestException;

import java.util.List;

/**
 * jackson 序列化工具类
 * @author xia17
 * @date 2020/12/24 17:59
 */
@Slf4j
public class JacksonUtil {

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();


    /**
     * 对象化序列化成 JSON String
     * @param obj /
     * @return /
     */
    public static String toJsonStr(Object obj){
        try {
            return OBJECT_MAPPER.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.error("将" + obj.getClass().getName() + "对象序列化成JSON时发生异常",e);
            throw new BadRequestException("将" + obj.getClass().getName() + "对象序列化成JSON时发生异常",e);
        }
    }

    /**
     * 反序列化
     * @param json json
     * @param clz 类型
     * @param <T> 类型
     * @return 实体
     */
    public static<T> T toEntity(String json , Class<T> clz){
        try {
            return OBJECT_MAPPER.readValue(json,clz);
        } catch (JsonProcessingException e) {
            log.error("将" + json + "反序列化成 "  + clz.getName() + "时发生异常",e);
            throw new BadRequestException("将" + json + "反序列化成 "  + clz.getName() + "时发生异常",e);
        }
    }

    /**
     * 反序列化成entityList
     * @param json json
     * @param clz 类型
     * @param <T> 类型
     * @return 实体
     */
    public static<T> List<T> toEntityList(String json , Class<T> clz){

        JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametricType(List.class, clz);

        try {
            return OBJECT_MAPPER.readValue(json, javaType);
        } catch (JsonProcessingException e) {
            log.error("将" + json + "反序列化成 "  + clz.getName() + "时发生异常",e);
            throw new BadRequestException("将" + json + "反序列化成 "  + clz.getName() + "时发生异常",e);
        }
    }

}
